<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /* 检查变量类型
         1.typeof（typeof xxx）:
          只能检测出6种数据类型：number、string、boolean、function、undefined、object
          无法检测具体的引用类型

         2.instanceof（  object instanceof constructor） a的原型是否b 检测原型链
         一般用来检测引用类型数据，例如某个实例是否属于某个对象
         3.constructor（xx.constructor)//返回构造函数
            一般用来根据数据类型 new 数据
        4.Object.prototype.toString.call（xx），(推荐-什么都能检测出来，包含undefined和null)
        不能用xx.toString()(这样会把值直接输出)
         */
        const a=new WeakMap([]);
        console.log(typeof a);// object
        console.log(a.toString());// [object WeakMap]
        console.log(Object.getPrototypeOf(a),WeakMap.prototype, a instanceof WeakMap )
        console.log(Object.getPrototypeOf(a),Object.prototype,a instanceof Object )

        const arr=[null,undefined,'string',123,true,[],{},function(){},new RegExp(),new Date(),new Map(),new Set(),new WeakMap(),new WeakSet(),new Error()]
        
        {
            console.log('typeof xxx')
        
            for (const iterator of arr) {
                console.log(getType (iterator))
            }

            // 获取数据类型
            function getType (data) {
                return typeof data;
            }
        }


        {
            console.log('xxx.constructor')
        
            for (const iterator of arr) {
                console.log(getType (iterator))
            }

            // 获取数据类型
            function getType (data) {
                return data?.constructor;
            }
        }
      
        {
            console.log('Object.prototype.toString')
            for (const iterator of arr) {
                console.log(getType (iterator))
            }
            
            // 获取数据类型
            function getType (data) {
                return Object.prototype.toString.call(data).slice(8,-1)
            }
        }

       
    </script>

    <script>
        //因为数据类型通过一个标签表示，0代表object,而null是0x00所以也是0
        // console.log(typeof null);// object 
        // console.log(typeof undefined);// undefined
    </script>
</body>
</html>